package main.java;

/**
 * @program: pratice
 * @author: 关键我是大怪
 * @create: 2021-09-09 21:45
 */

import java.util.HashMap;

/**
 * 题目：
 * 给定一个已按照 升序排列的整数数组numbers，请你从数组中找出两个数满足相加之和等于目标数target 。
 * 函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标从0开始计数 ，
 * 所以答案数组应当满足 0 <= answer[0] < answer[1] < numbers.length 。
 * 假设数组中存在且只存在一对符合条件的数字，同时一个数字不能使用两次。
 */

public class Test17_排序数组中两个数字之和 {
    public static int[] twoSum(int[] numbers, int target) {
        HashMap<Integer, Integer> map = new HashMap<>();
        int a = numbers.length;
        for (int i = 0; i < a; i++) {
            int x = numbers[i];
            if (map.containsKey(target - x)) {
                return new int[]{map.get(target - x), i};
            }
            map.put(numbers[i], i);
        }
        return new int[0];

    }


    //双指针法
    public static int[] twoSum1(int[] numbers, int target) {
        int start = 0;
        int end = numbers.length - 1;
        while (start < end) {
            if (numbers[start] + numbers[end] > target) {
                end--;
            } else if (numbers[start] + numbers[end] == target) {
                return new int[]{start, end};
            } else {
                start++;
            }
        }
        return new int[0];
    }

    public static void main(String[] args) {
        int[] a = new int[]{0, 0, 2, 4};
        int[] ints = twoSum1(a, 0);
        for (int anInt : ints) {
            System.out.println(anInt);
        }
    }
}
